Appendix overview
In this appendix, I report additional exploratory analyses of the organization of the sets of “conceptual units” that were excluded from the main text of Chapter IV, including: (a) Visualizations and analyses of the relationships among conceptual units using scales derived from EFA of children’s own responses, rather than adults’ responses, for 7- to 9-year-old children in Study 3, 4- to 6-year-old children in Study 3, and 4- to 5-year-old children in Study 4; (b) Visualizations and analyses of age-related changes in difference scores between conceptual units (scored using adults’ scales) for 7- to 9-year-old children in Study 2, 4- to 9-year-old children in Study 3, and 4- to 5-year-old children in Study 4; and (c) Visualizations of the joint dependency of HEART on both BODY and MIND.
The joint dependency of HEART on both BODY and MIND
A particularly robust and reliable finding reported in the main text of Chapter IV was that US adults virtually never endorsed HEART more strongly than either BODY or MIND. (US children between the ages of 4-9y also demonstrated increasingly adult-like asymmetries in their BODY, HEART, and MIND attributions with age.) I argued in that chapter that this pattern of findings is consitent with the possibility that adults’ mental capacity attributions are governed by an intuitive theory of mental life specifying that, in order for a being to have the social-emotional abilities of the HEART, it must also have the physiological sensations of the BODY and the perceptual-cognitive abilities of the mind.
I illustrated support for this hypothesis with a visualization of participants’ BODY, HEART, and MIND scores, which demonstrated that, among adults in Studies 1-4, strong endorsements of HEART abilities only occurred among participants who also gave strong endorsements of both BODY and MIND abilities (see Figure 4.11, top row). These tendencies appeared to be weaker among children (middle and bottom rows).
Here I provide a formal analysis of joint dependency in each age group separately, and a formal comparison of these tendencies across age groups. These analyses were conducted using data pooled across all samples (i.e., Studies 1-4 for adults, Studies 2 and 3 for 7- to 9-year-old children, and Studies 3 and 4 for 4- to 6-year-old children). The primary parameter of interest in these analyses is the interaction between BODY and MIND scores: If attributions of HEART are jointly dependent on attributions of both BODY and MIND, then the interaction between BODY and MIND scores should be a strong predictor of HEART scores, above and beyond either BODY scores or MIND scores on their own. In addition to using BODY scores (when MIND scores are at zero), MIND scores (when BODY scores are at zero), and the interaction between BODY and MIND scores to predict HEART scores, these models also include random intercepts for participants, nested within studies, and random intercepts for target characters.
Among adults, the interaction between BODY and MIND scores was clearly differentiable from zero, lending further support to the claim that HEART is jointly dependent on both BODY and MIND among US adults. In contrast, the interaction between BODY and MIND scores was not differentiable from zero among either 7- to 9-year-old or 4- to 6-year-old children (see “BODY * MIND” row in Table B.3), suggesting that this joint dependency is not present in the aggregate for either of these age groups. A formal comparison across age groups further confirmed these apparent developmental differences: The interactive effect was substantially attenuated among both older children and younger children, relative to adults (see “BODY & MIND” rows in Table B.4).
Table B.3: Regression analyses of the joint dependency of HEART on both BODY and MIND. The table presents results from a series of Bayesian regressions using pooled data from all samples within an age group (i.e., Studies 1-4 for adults, Studies 2 and 3 for 7- to 9-year-old children, and Studies 3 and 4 for 4 - to 6-year-old children. These regressions each included 4 fixed effect parameters: (1) the intercept, which is an index of HEART scores when BODY and MIND scores were both zero; (2) the effect of BODY scores on HEART scores (when MIND scores were zero); (3) the effect of MIND scores on HEART scores (when BODY scores were zero); and (4) the interactive effect of BODY and MIND scores on HEART scores. This last effect is highlighted in bold, because it is the primary parameter of interest for these analyses. In addition to the fixed effects listed here, these regressions included random intercepts for participants, nested within studies, for adults and for 4- to 6-year-old children; random intercepts for studies for 7- to 9-year-old children (since neither study with this age group featured a within-subjects design); and random intercepts for target characters (n = 21 for adults, n = 9 for both 7- to 9-year-old and 4- to 6-year-old children). For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 7-9y |
Children, 4-6y |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| Intercept |
0.01 |
[-0.06, 0.08] |
|
0.13 |
[-3.06, 3.76] |
|
-0.07 |
[-5.01, 4.44] |
|
| BODY |
0.13 |
[ 0.05, 0.21] |
* |
0.68 |
[ 0.38, 0.99] |
* |
0.48 |
[ 0.30, 0.66] |
* |
| MIND |
-0.04 |
[-0.08, 0.00] |
* |
0.14 |
[-0.12, 0.41] |
|
0.41 |
[ 0.22, 0.60] |
* |
| BODY:MIND |
0.42 |
[ 0.34, 0.51] |
* |
-0.12 |
[-0.52, 0.30] |
|
-0.13 |
[-0.43, 0.18] |
|
Table B.3: Regression analyses of the joint dependency of HEART on both BODY and MIND. The table presents results from a single Bayesian regression on pooled data from all samples in all studies. This regression included 12 fixed effect parameters: (1) the intercept (for adults), which is an index of HEART scores among adults when BODY and MIND scores were both zero; (2-3) the differences between older children vs. adults and younger children vs. adults in their HEART scores when BODY and MIND scores were both zero; (4-6) the effect of BODY scores on HEART scores for adults, and differences from adults in this effect for older and younger children; (7-9) the effect of MIND scores on HEART scores for adults, and differences from adults in this effect for older and younger children; (10-11) the interactive effect of BODY and MIND scores on HEART scores for adults, and differences from adults in this interactive effect for older and younger children. These last three effects are highlighted in bold, because these are the primary parameters of interest for these analyses. In addition to the fixed effects listed here, the regression included random intercepts for participants, nested within studies, and random intercepts for characters (n = 24). For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
| Parameter |
b |
95% CI |
|
| HEART scores when BODY scores and MIND scores = 0 |
| Intercept |
0.00 |
[-0.07, 0.07] |
|
| Older children vs. adults |
0.02 |
[-0.09, 0.12] |
|
| Younger children vs. adults |
0.02 |
[-0.05, 0.10] |
|
| The effect of BODY scores on HEART scores when MIND scores = 0 |
| BODY |
0.13 |
[ 0.04, 0.22] |
* |
| BODY * Older children vs. adults |
0.54 |
[ 0.34, 0.73] |
* |
| BODY * Younger children vs. adults |
0.45 |
[ 0.29, 0.62] |
* |
| The effect of MIND scores on HEART scores when BODY scores = 0 |
| MIND |
-0.06 |
[-0.10, -0.01] |
* |
| MIND * Older children vs. adults |
0.31 |
[ 0.16, 0.46] |
* |
| MIND * Younger children vs. adults |
0.45 |
[ 0.29, 0.60] |
* |
| The interactive effect of BODY scores and MIND scores on HEART scores |
| BODY * MIND |
0.44 |
[ 0.34, 0.54] |
* |
| BODY * MIND * Older children vs. adults |
-0.62 |
[-0.88, -0.35] |
* |
| BODY * MIND * Younger children vs. adults |
-0.63 |
[-0.91, -0.36] |
* |
LS0tCnRpdGxlOiAiQXBwZW5kaXggQjogQWRkaXRpb25hbCBleHBsb3JhdGlvbnMgb2Ygb3JnYW5pemF0aW9uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NywKICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBGLCBlY2hvID0gRikKYGBgCgpgYGB7cn0KIyAjIGZvciBrbml0dGluZyB0byAuZG9jeAojIG91dHB1dDoKIyAgIHdvcmRfZG9jdW1lbnQ6CiMgICAgIHJlZmVyZW5jZV9kb2N4OiAiLi93b3JkLXN0eWxlcy1yZWZlcmVuY2UuZG9jeCIKIyBhbHdheXNfYWxsb3dfaHRtbDogeWVzCgojICMgZm9yIGtuaXR0aW5nIHRvIC5uYi5odG1sIAojIG91dHB1dDoKIyAgIGh0bWxfbm90ZWJvb2s6CiMgICAgIHRvYzogeWVzCiMgICAgIHRvY19kZXB0aDogNAojICAgICB0b2NfZmxvYXQ6IHllcwpgYGAKCmBgYHtyfQojIHJ1biB1ci1zZXR1cCBzY3JpcHQgKHdoaWNoIHJ1bnMgb3RoZXIgc2NyaXB0cykKc291cmNlKCIuL3NjcmlwdHMvX1NFVFVQLlIiKQoKIyBsb2FkIGluIEVGQXMgJiBuYW1lcyBmcm9tIENoYXB0ZXJzIElJSSAmIElWCnNvdXJjZSgiLi9zY3JpcHRzL3N0b3JlZF9jaDAzLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9zdG9yZWRfY2gwNC5SIikKYGBgCgojIEFwcGVuZGl4IG92ZXJ2aWV3CgpJbiB0aGlzIGFwcGVuZGl4LCBJIHJlcG9ydCBhZGRpdGlvbmFsIGV4cGxvcmF0b3J5IGFuYWx5c2VzIG9mIHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHNldHMgb2YgImNvbmNlcHR1YWwgdW5pdHMiIHRoYXQgd2VyZSBleGNsdWRlZCBmcm9tIHRoZSBtYWluIHRleHQgb2YgQ2hhcHRlciBJViwgaW5jbHVkaW5nOiAoYSkgVmlzdWFsaXphdGlvbnMgYW5kIGFuYWx5c2VzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgdXNpbmcgc2NhbGVzIGRlcml2ZWQgZnJvbSBFRkEgb2YgY2hpbGRyZW4ncyBvd24gcmVzcG9uc2VzLCByYXRoZXIgdGhhbiBhZHVsdHMnIHJlc3BvbnNlcywgZm9yIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMywgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAzLCBhbmQgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSA0OyAoYikgVmlzdWFsaXphdGlvbnMgYW5kIGFuYWx5c2VzIG9mIGFnZS1yZWxhdGVkIGNoYW5nZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIGZvciA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDIsIDQtIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMywgYW5kIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgNDsgYW5kIChjKSBWaXN1YWxpemF0aW9ucyBvZiB0aGUgam9pbnQgZGVwZW5kZW5jeSBvZiBIRUFSVCBvbiBib3RoIEJPRFkgYW5kIE1JTkQuCgoKIyBSZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgdXNpbmcgc2NhbGVzIGRlcml2ZWQgZnJvbSBjaGlsZHJlbidzIEVGQXMKCkluIENoYXB0ZXIgSVYsIEkgdXNlZCBhZHVsdHMnIEVGQSBzb2x1dGlvbiB0byBjb25zdHJ1Y3QgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyBhbmQgdXNlZCB0aGVzZSBzY2FsZXMgdG8gYXNzZXNzIHRoZSBvcmdhbml6YXRpb24gb2YgdGhlc2UgYWR1bHQtbGlrZSBjb25jZXB0dWFsIHVuaXRzIGFtb25nIGJvdGggYWR1bHQgYW5kIGNoaWxkIHNhbXBsZXMuIEZvciBTdHVkeSAyLCBJIGFsc28gdXNlZCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3Mgb3duIEVGQSBzb2x1dGlvbiB0byBjb25zdHJ1Y3QgYSBzZXBhcmF0ZSBzZXQgb2Ygc2NhbGVzIGJhc2VkIG9uIGNoaWxkcmVuJ3Mgb3duIGNvbmNlcHR1YWwgdW5pdHMgYW5kIGNvbmR1Y3RlZCBhIHNlcGFyYXRlIHNldCBvZiBhbmFseXNlcyBvZiB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZXNlICJjaGlsZC1saWtlIiBjb25jZXB0dWFsIHVuaXRzLiBIZXJlIEkgcHJlc2VudCBhIHBhcmFsbGVsIHNldCBvZiBhbmFseXNlcyB1c2luZyBjaGlsZHJlbidzIG93biBFRkEgc29sdXRpb25zIChyYXRoZXIgdGhhbiBhZHVsdHMnKSB0byBhc3Nlc3MgdGhlIG9yZ2FuaXphdGlvbiBvZiBjb25jZXB0dWFsIHVuaXRzIGFtb25nIGJvdGggb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBhbmQgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpIGluIFN0dWR5IDMsIGFzIHdlbGwgYXMgYW1vbmcgY2hpbGRyZW4gKDQtNXkgb2YgYWdlKSBpbiBTdHVkeSA0LgoKIyMgU3R1ZHkgMwoKIyMjIE9sZGVyIGNoaWxkcmVuICg3LTl5KSwgdXNpbmcgdGhlaXIgb3duIHNjYWxlcwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQojIGRvbmUgaW4gY2gwNF9vcmdhbml6YXRpb24uUm1kCnNjYWxlc19lZmFfd2RtX2QzXzc5IDwtIHJlYWRSRFMoZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfNzkiKQoKZDNfNzlfc2NvcmVkXzc5IDwtIHNjb3JlX2Z1bihkM183OSwgc2NhbGVzX2VmYV93ZG1fZDNfNzkpCnNhdmVSRFMoZDNfNzlfc2NvcmVkXzc5LCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QzXzc5X3Njb3JlZF83OSIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNzkpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgQi4xLgoKIyMjIyBWaXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKYGBge3J9CnBsb3RzX2QzXzc5X3Njb3JlZF83OSA8LSByZWx2aXpfZnVuKGQzXzc5X3Njb3JlZF83OSwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM183OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbMl1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QzXzc5X3Njb3JlZF83OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM183OV9zY29yZWRfNzlbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzc5X3Njb3JlZF83OV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kM183OV9zY29yZWRfNzlfcGxvdHMsIGZpZ19kM183OV9zY29yZWRfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM183OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNy05eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzXzc5X3Njb3JlZF83OV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM183OV9zY29yZWRfNzlfdGl0bGUsIGZpZ19kM183OV9zY29yZWRfNzlfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QzXzc5X3Njb3JlZF83OV9wbG90c19sZWdfdGl0bGUKYGBgCgpgYGB7cn0KZDNfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZl9mdW4oZDNfNzlfc2NvcmVkXzc5KQpjb250cmFzdHMoZDNfNzlfc2NvcmVkXzc5X2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2R2MDkKCnNhdmVSRFMoZDNfNzlfc2NvcmVkXzc5X2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kM183OV9zY29yZWRfNzlfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDNfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzXzc5X3Njb3JlZF83OV9kaWZmLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kM183OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCIpCgpyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM183OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCIpCgpyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kM183OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDNfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkNoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM183OV9zY29yZWRfNzlfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzc5X3Njb3JlZF83OV9kaWZmCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3Mgc2NvcmVzIG9uIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgQi54eCwgcm93IEEuIFRoZSByZXN1bHRzIG9mIEJheWVzaWFuIHJlZ3Jlc3Npb25zIGNvbXBhcmluZyBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSBuaW5lICJkaXZlcnNlIGNoYXJhY3RlcnMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLCBhcmUgcHJvdmlkZWQgaW4gVGFibGUgQi54eC4KCk9uIHRoZSB3aG9sZSwgdGhlc2UgcmVzdWx0cyAodXNpbmcgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBkZXJpdmVkIGZyb20gRUZBIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4ncyByZXNwb25zZXMpIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgcHJlc2VudGVkIGluIHRoZSBtYWluIHRleHQgb2YgQ2hhcHRlciBJViAodXNpbmcgYWR1bHRzJyBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzKTogQ2hpbGRyZW4gc3lzdGVtYXRpY2FsbHkgZW5kb3JzZWQgX0JPRFlfIGFuZCBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMsIGJ1dCBzaG93ZWQgbm8gc3lzdGVtYXRpYyBhc3ltbWV0cnkgYmV0d2VlbiBCT0RZIGFuZCBNSU5ELiBUaGlzIGlzIHVuc3VycHJpc2luZywgc2luY2UgY2hpbGRyZW4ncyBhbmQgYWR1bHRzJyBzY2FsZXMgd2VyZSBzbyBzaW1pbGFyIHRvIGVhY2ggb3RoZXIgKHNlZSBUYWJsZSBCLnh4KS4KCiMjIyBZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5KSwgdXNpbmcgdGhlaXIgb3duIHNjYWxlcyAodGhyZWUtZmFjdG9yIHNvbHV0aW9uKQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM180NiA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM180NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM180NikKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kM180NiwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfNDYiKQoKZDNfNDZfc2NvcmVkXzQ2X3dkbSA8LSBzY29yZV9mdW4oZDNfNDYsIHNjYWxlc19lZmFfd2RtX2QzXzQ2KQpzYXZlUkRTKGQzXzQ2X3Njb3JlZF80Nl93ZG0sIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDNfNDZfc2NvcmVkXzQ2X3dkbSIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNDYpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDNfNDYgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgQi4xLgoKIyMjIyBWaXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKYGBge3J9CnBsb3RzX2QzXzQ2X3Njb3JlZF80Nl93ZG0gPC0gcmVsdml6X2Z1bihkM180Nl9zY29yZWRfNDZfd2RtLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzXzQ2X3Njb3JlZF80Nl93ZG1bWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM180Nl9zY29yZWRfNDZfd2RtW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkIxIiwgIkIyIiwgIkIzIiksIG5jb2wgPSAzKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbVtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3Bsb3RzLCBmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnkgKHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDMtZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3RpdGxlLCBmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWdfdGl0bGUKYGBgCgpgYGB7cn0KZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmIDwtIGRpZmZfZnVuKGQzXzQ2X3Njb3JlZF80Nl93ZG0pCmNvbnRyYXN0cyhkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2R2MDkKCnNhdmVSRFMoZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZKiAtIEhFQVJUKiIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX0hFQVJUIikKCnJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkqIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlfTUlORCIpCgpyX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQqIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkqIC0gSEVBUlQqIiwgIkJPRFkqIC0gTUlORCIsICJIRUFSVCogLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC02eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZgpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIHNjb3JlcyBvbiB0aGUgX0JPRFlcKl8sIF9IRUFSVFwqXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSBCLnh4LCByb3cgQi4gVGhlIHJlc3VsdHMgb2YgQmF5ZXNpYW4gcmVncmVzc2lvbnMgY29tcGFyaW5nIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIG5pbmUgImRpdmVyc2UgY2hhcmFjdGVycyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMsIGFyZSBwcm92aWRlZCBpbiBUYWJsZSBCLnh4LgoKQXMgaW4gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIHRoZSBtYWluIHRleHQgb2YgQ2hhcHRlciBJViAodXNpbmcgYWR1bHRzJyBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzKSwgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBzeXN0ZW1hdGljYWxseSBlbmRvcnNlZCBfQk9EWVwqXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX01JTkRfIGl0ZW1zLiBUaGlzIGlzIGZ1cnRoZXIgZXZpZGVuY2Ugb2YgYSBtYXJrZWRseSB1bi1hZHVsdC1saWtlIGludHVpdGlvbiB0aGF0IEJPRFkgbWF5IGJlIGEgbW9yZSBiYXNpYyBjb25jZXB0dWFsIHVuaXQgdGhhbiBNSU5ELgoKSW4gY29udHJhc3QgdG8gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIHRoZSBtYWluIHRleHQgb2YgQ2hhcHRlciBJViwgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIF9CT0RZXCpfIHZzLiBfSEVBUlRcKl8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHplcm8sIGFuZCB0aGV5IHN5c3RlbWF0aWNhbGx5IGVuZG9yc2VkIF9IRUFSVFwqXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX01JTkRfIGl0ZW1zLiBCb3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyByZW5kZXIgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIGNvbmNlcHR1YWwgb3JnYW5pemF0aW9ucyBldmVuIGxlc3MgYWR1bHQtbGlrZSB0aGFuIHRob3NlIHJlcG9ydGVkIGluIENoYXB0ZXIgSVYuCgojIyMgWW91bmdlciBjaGlsZHJlbiAoNC02eSksIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHR3by1mYWN0b3Igc29sdXRpb24pCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfcGFyX2QzXzQ2IDwtIHNjYWxlX2Z1bihlZmFfcGFyX2QzXzQ2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfcGFyX2QzXzQ2KQpzYXZlUkRTKHNjYWxlc19lZmFfcGFyX2QzXzQ2LCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3Bhcl9kM180NiIpCgpkM180Nl9zY29yZWRfNDZfcGFyIDwtIHNjb3JlX2Z1bihkM180Niwgc2NhbGVzX2VmYV9wYXJfZDNfNDYpCnNhdmVSRFMoZDNfNDZfc2NvcmVkXzQ2X3BhciwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kM180Nl9zY29yZWRfNDZfcGFyIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kM180NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3Bhcl9kM180NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSBCLjEuCgojIyMjIFZpc3VhbGl6YXRpb24gYW5kIGFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3BhciA8LSByZWx2aXpfZnVuKGQzXzQ2X3Njb3JlZF80Nl9wYXIsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3BhcltbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIpLCBuY29sID0gMykKCmZpZ19kM180Nl9zY29yZWRfNDZfcGFyX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzXzQ2X3Njb3JlZF80Nl9wYXJbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90cywgZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzLCAyLWZhY3RvciBzb2x1dGlvbikiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl90aXRsZSwgZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnX3RpdGxlCmBgYAoKYGBge3J9CmQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiA8LSBkaWZmX2Z1bihkM180Nl9zY29yZWRfNDZfcGFyKQpjb250cmFzdHMoZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjA5CgpzYXZlUkRTKGQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM180Nl9zY29yZWRfNDZfcGFyX2RpZmYsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlIRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFktSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZSEVBUlRfTUlORCIpCgpyX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlIRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWUhFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9ICJCT0RZLUhFQVJUIC0gTUlORCIsCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC02eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMi1mYWN0b3Igc29sdXRpb24pIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZgpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIHNjb3JlcyBvbiB0aGUgX0JPRFktSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgQi54eCwgcm93IEIuIFRoZSByZXN1bHRzIG9mIGEgQmF5ZXNpYW4gcmVncmVzc2lvbiBjb21wYXJpbmcgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcywgYXJlIHByb3ZpZGVkIGluIFRhYmxlIEIueHguCgpUaGUgbWFpbiB0YWtlLWF3YXkgb2YgdGhpcyBhbmFseXNpcyBpcyB0aGF0IDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4gcmVsaWFibHkgZW5kb3JzZWQgX0JPRFktSEVBUlRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfTUlORF8gaXRlbXMuCgojIyMgRGlzY3Vzc2lvbgoKYGBge3J9CmFsdHNjYWxlc19zdHVkeTMgPC0gYmluZF9yb3dzKAogIHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICBzY2FsZXNfZWZhX3dkbV9kM183OSAlPiUgCiAgICBtdXRhdGUoc3R1ZHkgPSAiT2xkZXIgY2hpbGRyZW4sIDctOXkiKSwKICBzY2FsZXNfZWZhX3dkbV9kM180NiAlPiUKICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbikiKSwKICBzY2FsZXNfZWZhX3Bhcl9kM180NiAlPiUKICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgyLWZhY3RvciBzb2x1dGlvbikiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSBmYWN0b3Ioc3R1ZHksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9sZGVyIGNoaWxkcmVuLCA3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pIikpKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGlmZWxzZSghaXMubmEoYEFkdWx0c2ApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBZHVsdHNgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbGRlciBjaGlsZHJlbiwgNy05eWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkpKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGVCLjEgPC0gYWx0c2NhbGVzX3N0dWR5MyAlPiUKICBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikgJT4lCiAgIyBkZWFsIHdpdGggeW91bmdlciBjaGlsZHJlbiwgMi1mYWN0b3Igc29sdXRpb24KICBtdXRhdGUodGVtcDEgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB8IAogICAgICAgICAgICAgdGVtcDIgPT0gYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogICMgZGVhbCB3aXRoIHlvdW5nZXIgY2hpbGRyZW4sIDMtZmFjdG9yIHNvbHV0aW9uCiAgbXV0YXRlKHRlbXAxID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIHRlbXAyID0gZ3N1YigiXFwqIiwgIiIsIHRlbXAxKSwKICAgICAgICAgdGVtcDMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgdGVtcDIgPT0gYEFkdWx0c2AgfCAKICAgICAgICAgICAgIHRlbXAyID09IGBPbGRlciBjaGlsZHJlbiwgNy05eWAgfAogICAgICAgICAgICAgKGlzLm5hKGBBZHVsdHNgKSAmIGlzLm5hKGBPbGRlciBjaGlsZHJlbiwgNy05eWApKSB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKGBBZHVsdHNgLCBgT2xkZXIgY2hpbGRyZW4sIDctOXlgKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAi4pyTIikpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiWW91bmdlciIpKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAuKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5LAogICAgICAgICBgMy1mYWN0b3Igc29sdXRpb25gID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIGAyLWZhY3RvciBzb2x1dGlvbmAgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgQi4xOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMsIG9sZGVyIGNoaWxkcmVuLCBhbmQgeW91bmdlciBjaGlsZHJlbiBpbiBTdHVkeSAzIChzZWUgQ2hhcHRlciBJSUkpLiBGb3IgeW91bmdlciBjaGlsZHJlbiwgdGhpcyBpbmNsdWRlcyBzY2FsZXMgZm9yIGJvdGggdGhyZWUtIGFuZCB0d28tZmFjdG9yIEVGQSBzb2x1dGlvbnMuIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc2FtcGxlLiBUaGUgY29uY2VwdHVhbCB1bml0cyBvZiB5b3VuZ2VyIGNoaWxkcmVuIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgZnJvbSB0aG9zZSBvZiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBzdWNoIHRoYXQgc29tZSBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGluY2x1ZGVkIGluIGRpZmZlcmVudCBzY2FsZXMgYWNyb3NzIGFnZSBncm91cHMgKGUuZy4sIGZlZWwgc2NhcmVkIHdhcyBwYXJ0IG9mIHRoZSBCT0RZIHNjYWxlIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBidXQgcGFydCBvZiB0aGUgSEVBUlQqIHNjYWxlIGZvciB5b3VuZ2VyIGNoaWxkcmVuKS4gSW4gdGhlc2UgY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBzY2FsZSBpcyBwcm92aWRlZCAocmF0aGVyIHRoYW4gYSBjaGVja21hcmspLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgNykgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCA4LCAxNCkgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDE1LCAyMCkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5IiA9IDIpKQpgYGAKCmBgYHtyIHRhYmxlQi4xLCBpbmNsdWRlID0gVH0KdGFibGVCLjEKYGBgCgpgYGB7cn0KZmlndXJlQi4xIDwtIHBsb3RfZ3JpZChmaWdfZDNfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kM180Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZUIuMV9jYXAgPC0gYWRkX3N1YihmaWd1cmVCLjEsIHN0cl93cmFwKCJGaWd1cmUgQi4xOiBSZWxhdGlvbnNoaXBzIGFtb25nIG9sZGVyIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMywgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHNlZSBUYWJsZSBCLjEpLiBGb3IgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpLCB0d28gc2V0cyBvZiBzY29yZXMgYXJlIHByZXNlbnRlZDogdXNpbmcgYSB0aHJlZS1mYWN0b3IgRUZBIHNvbHV0aW9uIChCMS1CMykgYW5kIHVzaW5nIGEgdHdvLWZhY3RvciBFRkEgc29sdXRpb24gKEMxKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgYW5kIHNjYWxlIHVzZWQgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuNH0KZ2dkcmF3KGZpZ3VyZUIuMV9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZUIuMl9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kM183OV9zY29yZWRfNzlfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5XG4oc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90X2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eVxuKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzLCAzLWZhY3RvciBzb2x1dGlvbikiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICBwbG90X2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eVxuKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzLCAyLWZhY3RvciBzb2x1dGlvbikiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMC44KSwKICBsYWJlbHMgPSAiQVVUTyIpCgpmaWd1cmVCLjJfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmVCLjJfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sZWdlbmQocGxvdF9kM183OV9zY29yZWRfNzlfZGlmZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4xKSkKCmZpZ3VyZUIuMl9jYXAgPC0gYWRkX3N1YihmaWd1cmVCLjJfcGxvdHNfbGVnLCBzdHJfd3JhcCgiRmlndXJlIEIuMjogRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgYW5kIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLCB1c2luZyB0aGVpciBvd24gc2NhbGVzLiBGb3IgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpLCB0aGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIHRoZSB0aHJlZS1mYWN0b3IgRUZBIHNvbHV0aW9uIChwYW5lbCBCKSBhbmQgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgdGhlIHR3by1mYWN0b3Igc29sdXRpb24gKHBhbmVsIEM7IHNlZSBUYWJsZSBCLjEpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZUIuMl9jYXApCmBgYAoKIyMgU3R1ZHkgNAoKIyMjIFlvdW5nZXIgY2hpbGRyZW4gKDQtNnkpLCB1c2luZyB0aGVpciBvd24gc2NhbGVzICh0aHJlZS1mYWN0b3Igc29sdXRpb24pCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfcGFyX2Q0XzQ2IDwtIHNjYWxlX2Z1bihlZmFfcGFyX2Q0XzQ2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfcGFyX2Q0XzQ2KQpzYXZlUkRTKHNjYWxlc19lZmFfcGFyX2Q0XzQ2LCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3Bhcl9kNF80NiIpCgpkNF80Nl9zY29yZWRfNDZfcGFyIDwtIHNjb3JlX2Z1bihkNF80Niwgc2NhbGVzX2VmYV9wYXJfZDRfNDYpCnNhdmVSRFMoZDRfNDZfc2NvcmVkXzQ2X3BhciwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kNF80Nl9zY29yZWRfNDZfcGFyIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kNF80NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3Bhcl9kNF80NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSBCLjEuCgojIyMjIFZpc3VhbGl6YXRpb24gYW5kIGFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3BhciA8LSByZWx2aXpfZnVuKGQ0XzQ2X3Njb3JlZF80Nl9wYXIsIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3BhcltbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl9wYXJbWzJdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1szXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHMsIGZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC02eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfdGl0bGUsIGZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZ190aXRsZQpgYGAKCmBgYHtyfQpkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgPC0gZGlmZl9mdW4oZDRfNDZfc2NvcmVkXzQ2X3BhcikKY29udHJhc3RzKGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmLCBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9NSU5EIikKCnJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfSEVBUlRfTUlORCIpCgpyX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC02eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwKICBjaGFyX2xhYmVsID0gYygiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4ncyBzY29yZXMgb24gdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSBCLnh4LCByb3cgQS4gVGhlIHJlc3VsdHMgb2YgQmF5ZXNpYW4gcmVncmVzc2lvbnMgY29tcGFyaW5nIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMsIGFyZSBwcm92aWRlZCBpbiBUYWJsZSBCLnh4LgoKSW4gdGhlc2UgcmVncmVzc2lvbnMsIG5vbmUgb2YgdGhlIGFzeW1tZXRyaWVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyB3ZXJlIHJlbGlhYmx5IGRpc3Rpbmd1aXNoYWJsZSBmcm9tIHplcm8uCgojIyMgWW91bmdlciBjaGlsZHJlbiAoNC02eSksIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKGZvdXItZmFjdG9yIHNvbHV0aW9uKQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kNF80NiA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kNF80NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF80NikKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kNF80NiwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDRfNDYiKQoKZDRfNDZfc2NvcmVkXzQ2X3dkbSA8LSBzY29yZV9mdW4oZDRfNDYsIHNjYWxlc19lZmFfd2RtX2Q0XzQ2KQpzYXZlUkRTKGQ0XzQ2X3Njb3JlZF80Nl93ZG0sIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDRfNDZfc2NvcmVkXzQ2X3dkbSIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDRfNDYpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDRfNDYgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgQi4xLgoKIyMjIyBWaXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKYGBge3J9CnBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG0gPC0gcmVsdml6X2Z1bihkNF80Nl9zY29yZWRfNDZfd2RtLCBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1syXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbM11dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzRdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1s1XV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbNl1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIGxhYmVscyA9IHBhc3RlMCgiQyIsIDE6NiksIG5jb2wgPSAzKQoKZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX3Bsb3RzLCBmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgNDogQ2hpbGRyZW4sIDQtNnkgKHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX3RpdGxlLCBmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWdfdGl0bGUKYGBgCgpgYGB7cn0KZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmIDwtIGRpZmZfZnVuKGQ0XzQ2X3Njb3JlZF80Nl93ZG0pCmNvbnRyYXN0cyhkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiwgY29sb3JzID0gY29sb3JzMDIpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIEJPRFkgKG90aGVyKSIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIiKQoKcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0JPRFlvdGhlcikKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG5hdXNlYSkgLSBIRUFSVCoiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9IRUFSVCIpCgpyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfSEVBUlQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChvdGhlcikgLSBIRUFSVCoiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZb3RoZXJfSEVBUlQiKQoKcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9IRUFSVCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIE1JTkQqIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9NSU5EIikKCnJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAob3RoZXIpIC0gTUlORCoiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9NSU5EIikKCnJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9NSU5EIikKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCogLSBNSU5EKiIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIikKCnJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0JPRFlvdGhlciwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX0hFQVJULAogICAgICAgICAgICAgICAgICByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9NSU5ELAogICAgICAgICAgICAgICAgICByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIChuYXVzZWEpIC0gQk9EWSAob3RoZXIpIiwKICAgICAgICAgICAgICAgICJCT0RZIChuYXVzZWEpIC0gSEVBUlQqIiwgIkJPRFkgKG90aGVyKSAtIEhFQVJUKiIsCiAgICAgICAgICAgICAgICAiQk9EWSAobmF1c2VhKSAtIE1JTkQiLCAiQk9EWSAob3RoZXIpIC0gTUlORCIsCiAgICAgICAgICAgICAgICAiSEVBUlQqIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDQtNnkgKHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIsCiAgY2hhcl9sYWJlbCA9IGMoIlJvYm90IHZzLiBHTSIpKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuJ3Mgc2NvcmVzIG9uIHRoZSBfQk9EWVwqXywgX0hFQVJUXCpfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcHJvdmlkZWQgaW4gRmlndXJlIEIueHgsIHJvdyBCLiBUaGUgcmVzdWx0cyBvZiBCYXllc2lhbiByZWdyZXNzaW9ucyBjb21wYXJpbmcgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcywgYXJlIHByb3ZpZGVkIGluIFRhYmxlIEIueHguCgpUaGUgbWFpbiB0YWtlLWF3YXlzIG9mIHRoaXMgYW5hbHlzaXMgYXJlIHRoYXQgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiByZWxpYWJseSBlbmRvcnNlZCBfQk9EWSAob3RoZXIpXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gYW55IG90aGVyIGl0ZW1zLCBidXQgc2hvd2VkIG5vIHJlbGlhYmxlIGFzeW1tZXRyaWVzIGJldHdlZW4gdGhlIHJlbWFpbmluZyBjb25jZXB0dWFsIHVuaXRzIChfQk9EWSAobmF1c2VhKV8sIF9IRUFSVFwqXywgYW5kIF9NSU5EXykuCgojIyMgRGlzY3Vzc2lvbgoKYGBge3J9CmFsdHNjYWxlc19zdHVkeTMgPC0gYmluZF9yb3dzKAogIHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICBzY2FsZXNfZWZhX3Bhcl9kNF80NiAlPiUKICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbikiKSwKICBzY2FsZXNfZWZhX3dkbV9kNF80NiAlPiUKICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICg0LWZhY3RvciBzb2x1dGlvbikiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSBmYWN0b3Ioc3R1ZHksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDQtZmFjdG9yIHNvbHV0aW9uKSIpKSkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBBZHVsdHNgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQWR1bHRzYCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoNC1mYWN0b3Igc29sdXRpb24pYCkpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDRfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfYWQgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3Bhcl9kNF80NiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl80Nl9wYXIgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kNF80NiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl80Nl93ZG0gPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNDZfcGFyLCBvcmRlcl80Nl93ZG0pICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGVCLjIgPC0gYWx0c2NhbGVzX3N0dWR5MyAlPiUKICBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikgJT4lCiAgIyBkZWFsIHdpdGggeW91bmdlciBjaGlsZHJlbiwgMy1mYWN0b3Igc29sdXRpb24KICBtdXRhdGUodGVtcDEgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogICMgZGVhbCB3aXRoIHlvdW5nZXIgY2hpbGRyZW4sIDQtZmFjdG9yIHNvbHV0aW9uCiAgbXV0YXRlKHRlbXAxID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDQtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIHRlbXAyID0gZ3N1YigiXFwqIiwgIiIsIHRlbXAxKSwKICAgICAgICAgdGVtcDMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgdGVtcDIgPT0gYEFkdWx0c2AgfCAKICAgICAgICAgICAgIHRlbXAyID09IGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgIHwKICAgICAgICAgICAgIChpcy5uYShgQWR1bHRzYCkgJiBpcy5uYShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCkpIH4gIuKckyIsCiAgICAgICAgICAgaXMubmEodGVtcDIpIH4gIiIsCiAgICAgICAgICAgVFJVRSB+IHRlbXAxKSkgJT4lCiAgbXV0YXRlKGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICg0LWZhY3RvciBzb2x1dGlvbilgID0gdGVtcDMpICU+JQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoInRlbXAiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoYEFkdWx0c2ApLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsICLinJMiKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5LAogICAgICAgICBgNC1mYWN0b3Igc29sdXRpb25gID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDQtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIGAzLWZhY3RvciBzb2x1dGlvbmAgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgQi4yOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgYW5kIHlvdW5nZXIgY2hpbGRyZW4gaW4gU3R1ZHkgNCAoc2VlIENoYXB0ZXIgSUlJKS4gRm9yIHlvdW5nZXIgY2hpbGRyZW4sIHRoaXMgaW5jbHVkZXMgc2NhbGVzIGZvciBib3RoIHRocmVlLSBhbmQgZm91ci1mYWN0b3IgRUZBIHNvbHV0aW9ucy4gQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzYW1wbGUuIFRoZSBjb25jZXB0dWFsIHVuaXRzIG9mIHlvdW5nZXIgY2hpbGRyZW4gaW4gdGhlIGZvdXItZmFjdG9yIHNvbHV0aW9uIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgZnJvbSB0aG9zZSBvZiBhZHVsdHMsIHN1Y2ggdGhhdCBzb21lIG1lbnRhbCBjYXBhY2l0aWVzIHdlcmUgaW5jbHVkZWQgaW4gZGlmZmVyZW50IHNjYWxlcyBhY3Jvc3MgYWdlIGdyb3Vwcy4gSW4gdGhlc2UgY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBzY2FsZSBpcyBwcm92aWRlZCAocmF0aGVyIHRoYW4gYSBjaGVja21hcmspLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgNSkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCA2LCAxMCkgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDExLCAxNSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5IiA9IDIpKQpgYGAKCmBgYHtyIHRhYmxlQi4yLCBpbmNsdWRlID0gVH0KdGFibGVCLjIKYGBgCgpgYGB7cn0KZmlndXJlQi4zIDwtIHBsb3RfZ3JpZChmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLCAyKSwgbmNvbCA9IDEpCgpmaWd1cmVCLjNfY2FwIDwtIGFkZF9zdWIoZmlndXJlQi4zLCBzdHJfd3JhcCgiRmlndXJlIEIuMzogUmVsYXRpb25zaGlwcyBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgNCwgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHNlZSBUYWJsZSBCLjIpLiBUd28gc2V0cyBvZiBzY29yZXMgYXJlIHByZXNlbnRlZDogdXNpbmcgYSB0aHJlZS1mYWN0b3IgRUZBIHNvbHV0aW9uIChBMS1BMykgYW5kIHVzaW5nIGEgZm91ci1mYWN0b3IgRUZBIHNvbHV0aW9uIChCMS1CNikuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIGFuZCBzY2FsZSB1c2VkIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjR9CmdnZHJhdyhmaWd1cmVCLjNfY2FwKQpgYGAKCmBgYHtyfQpmaWd1cmVCLjRfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTZ5XG4oc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDMtZmFjdG9yIHNvbHV0aW9uKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogIHBsb3RfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTZ5XG4oc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogIG5jb2wgPSAyLCByZWxfd2lkdGhzID0gYygxLCAyKSwKICBsYWJlbHMgPSAiQVVUTyIpCgpmaWd1cmVCLjRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmVCLjRfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sZWdlbmQocGxvdF9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSkpCgpmaWd1cmVCLjRfY2FwIDwtIGFkZF9zdWIoZmlndXJlQi40X3Bsb3RzX2xlZywgc3RyX3dyYXAoIkZpZ3VyZSBCLjQ6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDQsIHVzaW5nIHRoZWlyIG93biBzY2FsZXMuIFRoaXMgaW5jbHVkZXMgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgdGhlIGZvdXItZmFjdG9yIEVGQSBzb2x1dGlvbiAocGFuZWwgQSkgYW5kIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb24gKHBhbmVsIEI7IHNlZSBUYWJsZSBCLjIpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZUIuNF9jYXApCmBgYAoKCiMgQWdlLXJlbGF0ZWQgY2hhbmdlcyBpbiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMKClhYIF9fQ09OVkVSVCBUTyBCUk1TX18KCiMjIFN0dWR5IDIKCmBgYHtyLCBpbmNsdWRlID0gVH0KZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIAogIGxlZnRfam9pbihkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGRpZmYsIGNvbG9yID0gY2hhcmFjdGVyKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBmYWNldF93cmFwKH4gcGFpcikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHBhaXIpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gImRpZmYiKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IDExKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciwgY29sb3IgPSBOVUxMKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaGFwZSA9ICJkaWFtb25kIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMwMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDc6MTEpLCBtaW5vcl9icmVha3MgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg3OjEwLCAieSIpLCAiQWR1bHRzIikpICsKICBnZW9tX3Ntb290aChjb2xvciA9ICJibGFjayIsIG1ldGhvZCA9ICJsbSIpICsKICBsYWJzKHRpdGxlID0gIlN0dWR5IDI6IERpZmZlcmVuY2Ugc2NvcmVzIG92ZXIgYWdlIiwKICAgICAgIHggPSAiQWdlICh5KSIsIHkgPSAiRGlmZmVyZW5jZSBzY29yZSIsIGNvbG9yID0gIlRhcmdldCBjaGFyYWN0ZXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQp0ZW1wX2QyX0JIIDwtIGxtKGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkMl83OV9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSAlPiUKICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkMl83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IHNjYWxlKGFnZSwgc2NhbGUgPSBGKSkpCnN1bW1hcnkodGVtcF9kMl9CSCkkY29lZmZpY2llbnRzICU+JSBrYWJsZShkaWdpdHMgPSAyKSAlPiUga2FibGVfc3R5bGluZygpCgp0ZW1wX2QyX0JNIDwtIGxtKGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkMl83OV9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpICU+JQogICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQyXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkgJT4lCiAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSkKc3VtbWFyeSh0ZW1wX2QyX0JNKSRjb2VmZmljaWVudHMgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkKCnRlbXBfZDJfSE0gPC0gbG0oZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2UsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpICU+JQogICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQyXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkgJT4lCiAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSkKc3VtbWFyeSh0ZW1wX2QyX0hNKSRjb2VmZmljaWVudHMgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkKYGBgCgojIyBTdHVkeSAzCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSAKICBsZWZ0X2pvaW4oZDNfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSAlPiUKICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgbGVmdF9qb2luKGQzXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkpICU+JQogICMgTk9URTogTUlTU0lORyAzNSBBR0VTISEKICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBkaWZmLCBjb2xvciA9IGNoYXJhY3RlcikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZmFjZXRfd3JhcCh+IHBhaXIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShwYWlyKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJkaWZmIikgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSAxMSksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsIGNvbG9yID0gTlVMTCksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hhcGUgPSAiZGlhbW9uZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzMDkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg0OjExKSwgbWlub3JfYnJlYWtzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhwYXN0ZTAoNDoxMCwgInkiKSwgIkFkdWx0cyIpKSArCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSAiYmxhY2siLCBtZXRob2QgPSAibG0iKSArCiAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBEaWZmZXJlbmNlIHNjb3JlcyBvdmVyIGFnZSIsCiAgICAgICB4ID0gIkFnZSAoeSkiLCB5ID0gIkRpZmZlcmVuY2Ugc2NvcmUiLCBjb2xvciA9ICJUYXJnZXQgY2hhcmFjdGVyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgpgYGB7cn0KdGVtcF9kM19CSCA8LSBsbShkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZSwKICAgICAgICAgICAgICAgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDNfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSAlPiUKICAgICAgICAgICAgICAgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkM180NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpKSAlPiUKICAgICAgICAgICAgICAgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSAlPiUKICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpKQpzdW1tYXJ5KHRlbXBfZDNfQkgpJGNvZWZmaWNpZW50cyAlPiUga2FibGUoZGlnaXRzID0gMikgJT4lIGthYmxlX3N0eWxpbmcoKQoKdGVtcF9kM19CTSA8LSBsbShkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZSwKICAgICAgICAgICAgICAgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZDNfNzkgJT4lIGRpc3RpbmN0KHN1YmlkLCBhZ2UpKSAlPiUKICAgICAgICAgICAgICAgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkM180NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpKSAlPiUKICAgICAgICAgICAgICAgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpICU+JQogICAgICAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IHNjYWxlKGFnZSwgc2NhbGUgPSBGKSkpCnN1bW1hcnkodGVtcF9kM19CTSkkY29lZmZpY2llbnRzICU+JSBrYWJsZShkaWdpdHMgPSAyKSAlPiUga2FibGVfc3R5bGluZygpCgp0ZW1wX2QzX0hNIDwtIGxtKGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUKICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkM183OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQzXzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkpICU+JQogICAgICAgICAgICAgICAgICAgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpICU+JQogICAgICAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IHNjYWxlKGFnZSwgc2NhbGUgPSBGKSkpCnN1bW1hcnkodGVtcF9kM19ITSkkY29lZmZpY2llbnRzICU+JSBrYWJsZShkaWdpdHMgPSAyKSAlPiUga2FibGVfc3R5bGluZygpCmBgYAoKIyMgU3R1ZHkgNAoKYGBge3IsIGluY2x1ZGUgPSBUfQpkNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUgCiAgbGVmdF9qb2luKGQ0XzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gZGlmZiwgY29sb3IgPSBjaGFyYWN0ZXIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGZhY2V0X3dyYXAofiBwYWlyKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkocGFpcikgJT4lCiAgICAgICAgICAgICAgICAgICAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAiZGlmZiIpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gNiksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsIGNvbG9yID0gTlVMTCksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hhcGUgPSAiZGlhbW9uZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzMDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg0OjYpLCBtaW5vcl9icmVha3MgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMCg0OjUsICJ5IiksICJBZHVsdHMiKSkgKwogIGdlb21fc21vb3RoKGNvbG9yID0gImJsYWNrIiwgbWV0aG9kID0gImxtIikgKwogIGxhYnModGl0bGUgPSAiU3R1ZHkgNDogRGlmZmVyZW5jZSBzY29yZXMgb3ZlciBhZ2UiLAogICAgICAgeCA9ICJBZ2UgKHkpIiwgeSA9ICJEaWZmZXJlbmNlIHNjb3JlIiwgY29sb3IgPSAiVGFyZ2V0IGNoYXJhY3RlciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3J9CnRlbXBfZDRfQkggPC0gbG1lcihkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZSArICgxIHwgc3ViaWQpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikgJT4lCiAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihkNF80NiAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSkKc3VtbWFyeSh0ZW1wX2Q0X0JIKSRjb2VmZmljaWVudHMgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkKCnRlbXBfZDRfQk0gPC0gbG1lcihkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZSArICgxIHwgc3ViaWQpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQ0XzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpKQpzdW1tYXJ5KHRlbXBfZDRfQk0pJGNvZWZmaWNpZW50cyAlPiUga2FibGUoZGlnaXRzID0gMikgJT4lIGthYmxlX3N0eWxpbmcoKQoKdGVtcF9kNF9ITSA8LSBsbWVyKGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlICsgKDEgfCBzdWJpZCksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGQ0XzQ2ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpKQpzdW1tYXJ5KHRlbXBfZDRfSE0pJGNvZWZmaWNpZW50cyAlPiUga2FibGUoZGlnaXRzID0gMikgJT4lIGthYmxlX3N0eWxpbmcoKQpgYGAKCiMgVGhlIGpvaW50IGRlcGVuZGVuY3kgb2YgSEVBUlQgb24gYm90aCBCT0RZIGFuZCBNSU5ECgpBIHBhcnRpY3VsYXJseSByb2J1c3QgYW5kIHJlbGlhYmxlIGZpbmRpbmcgcmVwb3J0ZWQgaW4gdGhlIG1haW4gdGV4dCBvZiBDaGFwdGVyIElWIHdhcyB0aGF0IFVTIGFkdWx0cyB2aXJ0dWFsbHkgbmV2ZXIgZW5kb3JzZWQgSEVBUlQgbW9yZSBzdHJvbmdseSB0aGFuIGVpdGhlciBCT0RZIG9yIE1JTkQuIChVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDQtOXkgYWxzbyBkZW1vbnN0cmF0ZWQgaW5jcmVhc2luZ2x5IGFkdWx0LWxpa2UgYXN5bW1ldHJpZXMgaW4gdGhlaXIgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGF0dHJpYnV0aW9ucyB3aXRoIGFnZS4pIEkgYXJndWVkIGluIHRoYXQgY2hhcHRlciB0aGF0IHRoaXMgcGF0dGVybiBvZiBmaW5kaW5ncyBpcyBjb25zaXRlbnQgd2l0aCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhZHVsdHMnIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYXJlIGdvdmVybmVkIGJ5IGFuIGludHVpdGl2ZSB0aGVvcnkgb2YgbWVudGFsIGxpZmUgc3BlY2lmeWluZyB0aGF0LCBpbiBvcmRlciBmb3IgYSBiZWluZyB0byBoYXZlIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBvZiB0aGUgSEVBUlQsIGl0IG11c3QgYWxzbyBoYXZlIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIEJPRFkgX2FuZF8gdGhlIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyBvZiB0aGUgbWluZC4gCgpJIGlsbHVzdHJhdGVkIHN1cHBvcnQgZm9yIHRoaXMgaHlwb3RoZXNpcyB3aXRoIGEgdmlzdWFsaXphdGlvbiBvZiBwYXJ0aWNpcGFudHMnIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY29yZXMsIHdoaWNoIGRlbW9uc3RyYXRlZCB0aGF0LCBhbW9uZyBhZHVsdHMgaW4gU3R1ZGllcyAxLTQsIHN0cm9uZyBlbmRvcnNlbWVudHMgb2YgX0hFQVJUXyBhYmlsaXRpZXMgb25seSBvY2N1cnJlZCBhbW9uZyBwYXJ0aWNpcGFudHMgd2hvIGFsc28gZ2F2ZSBzdHJvbmcgZW5kb3JzZW1lbnRzIG9mIF9ib3RoXyBfQk9EWV8gYW5kIF9NSU5EXyBhYmlsaXRpZXMgKHNlZSBGaWd1cmUgNC4xMSwgdG9wIHJvdykuIFRoZXNlIHRlbmRlbmNpZXMgYXBwZWFyZWQgdG8gYmUgd2Vha2VyIGFtb25nIGNoaWxkcmVuIChtaWRkbGUgYW5kIGJvdHRvbSByb3dzKS4KCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIGpvaW50IGRlcGVuZGVuY3kgaW4gZWFjaCBhZ2UgZ3JvdXAgc2VwYXJhdGVseSwgYW5kIGEgZm9ybWFsIGNvbXBhcmlzb24gb2YgdGhlc2UgdGVuZGVuY2llcyBhY3Jvc3MgYWdlIGdyb3Vwcy4gVGhlc2UgYW5hbHlzZXMgd2VyZSBjb25kdWN0ZWQgdXNpbmcgZGF0YSBwb29sZWQgYWNyb3NzIGFsbCBzYW1wbGVzIChpLmUuLCBTdHVkaWVzIDEtNCBmb3IgYWR1bHRzLCBTdHVkaWVzIDIgYW5kIDMgZm9yIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4sIGFuZCBTdHVkaWVzIDMgYW5kIDQgZm9yIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4pLiBUaGUgcHJpbWFyeSBwYXJhbWV0ZXIgb2YgaW50ZXJlc3QgaW4gdGhlc2UgYW5hbHlzZXMgaXMgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gc2NvcmVzOiBJZiBhdHRyaWJ1dGlvbnMgb2YgSEVBUlQgYXJlIGpvaW50bHkgZGVwZW5kZW50IG9uIGF0dHJpYnV0aW9ucyBvZiBib3RoIEJPRFkgYW5kIE1JTkQsIHRoZW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gc2NvcmVzIHNob3VsZCBiZSBhIHN0cm9uZyBwcmVkaWN0b3Igb2YgX0hFQVJUXyBzY29yZXMsIGFib3ZlIGFuZCBiZXlvbmQgZWl0aGVyIF9CT0RZXyBzY29yZXMgb3IgX01JTkRfIHNjb3JlcyBvbiB0aGVpciBvd24uIEluIGFkZGl0aW9uIHRvIHVzaW5nIF9CT0RZXyBzY29yZXMgKHdoZW4gX01JTkRfIHNjb3JlcyBhcmUgYXQgemVybyksIF9NSU5EXyBzY29yZXMgKHdoZW4gX0JPRFlfIHNjb3JlcyBhcmUgYXQgemVybyksIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBzY29yZXMgdG8gcHJlZGljdCBfSEVBUlRfIHNjb3JlcywgdGhlc2UgbW9kZWxzIGFsc28gaW5jbHVkZSByYW5kb20gaW50ZXJjZXB0cyBmb3IgcGFydGljaXBhbnRzLCBuZXN0ZWQgd2l0aGluIHN0dWRpZXMsIGFuZCByYW5kb20gaW50ZXJjZXB0cyBmb3IgdGFyZ2V0IGNoYXJhY3RlcnMuCgpBbW9uZyBhZHVsdHMsIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIF9CT0RZXyBhbmQgX01JTkRfIHNjb3JlcyB3YXMgY2xlYXJseSBkaWZmZXJlbnRpYWJsZSBmcm9tIHplcm8sIGxlbmRpbmcgZnVydGhlciBzdXBwb3J0IHRvIHRoZSBjbGFpbSB0aGF0IEhFQVJUIGlzIGpvaW50bHkgZGVwZW5kZW50IG9uIGJvdGggQk9EWSBhbmQgTUlORCBhbW9uZyBVUyBhZHVsdHMuIEluIGNvbnRyYXN0LCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBzY29yZXMgd2FzIG5vdCBkaWZmZXJlbnRpYWJsZSBmcm9tIHplcm8gYW1vbmcgZWl0aGVyIDctIHRvIDkteWVhci1vbGQgb3IgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoc2VlICJCT0RZIFwqIE1JTkQiIHJvdyBpbiBUYWJsZSBCLjMpLCBzdWdnZXN0aW5nIHRoYXQgdGhpcyBqb2ludCBkZXBlbmRlbmN5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBhZ2dyZWdhdGUgZm9yIGVpdGhlciBvZiB0aGVzZSBhZ2UgZ3JvdXBzLiBBIGZvcm1hbCBjb21wYXJpc29uIGFjcm9zcyBhZ2UgZ3JvdXBzIGZ1cnRoZXIgY29uZmlybWVkIHRoZXNlIGFwcGFyZW50IGRldmVsb3BtZW50YWwgZGlmZmVyZW5jZXM6IFRoZSBpbnRlcmFjdGl2ZSBlZmZlY3Qgd2FzIHN1YnN0YW50aWFsbHkgYXR0ZW51YXRlZCBhbW9uZyBib3RoIG9sZGVyIGNoaWxkcmVuIGFuZCB5b3VuZ2VyIGNoaWxkcmVuLCByZWxhdGl2ZSB0byBhZHVsdHMgKHNlZSAiQk9EWSAmIE1JTkQiIHJvd3MgaW4gVGFibGUgQi40KS4KCmBgYHtyfQojIHJfam9pbnRkZXAgPC0gYnJtKEhFQVJUIH4gQk9EWSAqIE1JTkQgKiBhZ2VfZ3JvdXAgKwojICAgICAgICAgICAgICAgICAgICAgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdHVkeS9zdWJpZCksCiMgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNjb3Jlc19hbGwgJT4lIHNwcmVhZChmYWN0b3IsIHNjb3JlKSwKIyAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQpCiMgc2F2ZVJEUyhyX2pvaW50ZGVwLCAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9qb2ludGRlcCIpCgpyX2pvaW50ZGVwIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3Jfam9pbnRkZXAiKQoKc3VtbWFyeShyX2pvaW50ZGVwKQpgYGAKCmBgYHtyfQojIHJfam9pbnRkZXBfYWQgPC0gYnJtKEhFQVJUIH4gQk9EWSAqIE1JTkQgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN0dWR5L3N1YmlkKSwKIyAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2NvcmVzX2FsbCAlPiUgc3ByZWFkKGZhY3Rvciwgc2NvcmUpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAiQWR1bHRzIiksCiMgICAgICAgICAgICAgICAgICAgICAgY29yZXMgPSA0KQojIHNhdmVSRFMocl9qb2ludGRlcF9hZCwgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3Jfam9pbnRkZXBfYWQiKQoKcl9qb2ludGRlcF9hZCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2pvaW50ZGVwX2FkIikKCnN1bW1hcnkocl9qb2ludGRlcF9hZCkKYGBgCgpgYGB7cn0KIyByX2pvaW50ZGVwXzc5IDwtIGJybShIRUFSVCB+IEJPRFkgKiBNSU5EICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdHVkeSksCiMgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZCAlPiUgCiMgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZChmYWN0b3IsIHNjb3JlKSwKIyAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsIGl0ZXIgPSAyMDAwLAojICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQojIHNhdmVSRFMocl9qb2ludGRlcF83OSwgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3Jfam9pbnRkZXBfNzkiKQoKcl9qb2ludGRlcF83OSA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2pvaW50ZGVwXzc5IikKCnN1bW1hcnkocl9qb2ludGRlcF83OSkKYGBgCgpgYGB7cn0KIyByX2pvaW50ZGVwXzQ2IDwtIGJybShIRUFSVCB+IEJPRFkgKiBNSU5EICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdHVkeS9zdWJpZCksCiMgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZCAlPiUKIyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfam9pbihkNF80Nl9zY29yZWRfYWQpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKGZhY3Rvciwgc2NvcmUpLAojICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gNCwgaXRlciA9IDIwMDAsCiMgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCiMgc2F2ZVJEUyhyX2pvaW50ZGVwXzQ2LCAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9qb2ludGRlcF80NiIpCgpyX2pvaW50ZGVwXzQ2IDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3Jfam9pbnRkZXBfNDYiKQoKc3VtbWFyeShyX2pvaW50ZGVwXzQ2KQpgYGAKCmBgYHtyfQpyZWd0YWJfam9pbnRkZXBfYnlhZ2Vncm91cCA8LSBiaW5kX3Jvd3MoCiAgZml4ZWYocl9qb2ludGRlcF9hZCkgJT4lCiAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtIikgJT4lCiAgICBtdXRhdGUoYWdlX2dyb3VwID0gIkFkdWx0cyIpLAogIGZpeGVmKHJfam9pbnRkZXBfNzkpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbSIpICU+JQogICAgbXV0YXRlKGFnZV9ncm91cCA9ICJDaGlsZHJlbiwgNy05eSIpLAogIGZpeGVmKHJfam9pbnRkZXBfNDYpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbSIpICU+JQogICAgbXV0YXRlKGFnZV9ncm91cCA9ICJDaGlsZHJlbiwgNC02eSIpKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBzLmUuID0gRXN0LkVycm9yKSAlPiUKICBtdXRhdGUocGFyYW0gPSBmYWN0b3IocGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkludGVyY2VwdCIsICJCT0RZIiwgIk1JTkQiLCAiQk9EWTpNSU5EIikpLAogICAgICAgICBiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgcy5lLiA9IGZvcm1hdChyb3VuZChzLmUuLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgIENJOTUgPSBwYXN0ZTAoIlsiLCBmb3JtYXQocm91bmQoUTIuNSwgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICIsICIsIGZvcm1hdChyb3VuZChROTcuNSwgMiksIG5zbWFsbCA9IDIpLCAiXSIpLAogICAgICAgICBub256ZXJvID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+PSAwLCAiKiIsICIiKSkgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiUSIpKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJzLmUuIikpICU+JQogIGdhdGhlcihrZXksIHZhbHVlLCAtYyhhZ2VfZ3JvdXAsIHBhcmFtKSkgJT4lCiAgbXV0YXRlKGtleSA9IGNhc2Vfd2hlbihhZ2VfZ3JvdXAgPT0gIkFkdWx0cyIgfiBwYXN0ZTAoImFkXyIsIGtleSksCiAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPT0gIkNoaWxkcmVuLCA3LTl5IiB+IHBhc3RlMCgiY2gwMV8iLCBrZXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID09ICJDaGlsZHJlbiwgNC02eSIgfiBwYXN0ZTAoImNoMDJfIiwga2V5KSkpICU+JQogIHNlbGVjdCgtYWdlX2dyb3VwKSAlPiUKICBzcHJlYWQoa2V5LCB2YWx1ZSkgJT4lCiAgYXJyYW5nZShwYXJhbSkKYGBgCgpgYGB7cn0KdGFibGVCLjMgPC0gcmVndGFiX2pvaW50ZGVwX2J5YWdlZ3JvdXAgJT4lCiAgc2VsZWN0KC1jb250YWlucygicy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0sCiAgICAgICAgIGIgPSBhZF9iLCBiID0gY2gwMV9iLCBiID0gY2gwMl9iLAogICAgICAgICBgOTUlIENJYCA9IGFkX0NJOTUsIGA5NSUgQ0lgID0gY2gwMV9DSTk1LCBgOTUlIENJYCA9IGNoMDJfQ0k5NSwKICAgICAgICAgIiAiID0gYWRfbm9uemVybywgIiAiID0gY2gwMV9ub256ZXJvLCAiICIgPSBjaDAyX25vbnplcm8pICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSBCLjM6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgdGhlIGpvaW50IGRlcGVuZGVuY3kgb2YgSEVBUlQgb24gYm90aCBCT0RZIGFuZCBNSU5ELiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIGEgc2VyaWVzIG9mIEJheWVzaWFuIHJlZ3Jlc3Npb25zIHVzaW5nIHBvb2xlZCBkYXRhIGZyb20gYWxsIHNhbXBsZXMgd2l0aGluIGFuIGFnZSBncm91cCAoaS5lLiwgU3R1ZGllcyAxLTQgZm9yIGFkdWx0cywgU3R1ZGllcyAyIGFuZCAzIGZvciA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuLCBhbmQgU3R1ZGllcyAzIGFuZCA0IGZvciA0IC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbi4gVGhlc2UgcmVncmVzc2lvbnMgZWFjaCBpbmNsdWRlZCA0IGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggaXMgYW4gaW5kZXggb2YgSEVBUlQgc2NvcmVzIHdoZW4gQk9EWSBhbmQgTUlORCBzY29yZXMgd2VyZSBib3RoIHplcm87ICgyKSB0aGUgZWZmZWN0IG9mIEJPRFkgc2NvcmVzIG9uIEhFQVJUIHNjb3JlcyAod2hlbiBNSU5EIHNjb3JlcyB3ZXJlIHplcm8pOyAoMykgdGhlIGVmZmVjdCBvZiBNSU5EIHNjb3JlcyBvbiBIRUFSVCBzY29yZXMgKHdoZW4gQk9EWSBzY29yZXMgd2VyZSB6ZXJvKTsgYW5kICg0KSB0aGUgaW50ZXJhY3RpdmUgZWZmZWN0IG9mIEJPRFkgYW5kIE1JTkQgc2NvcmVzIG9uIEhFQVJUIHNjb3Jlcy4gVGhpcyBsYXN0IGVmZmVjdCBpcyBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIGl0IGlzIHRoZSBwcmltYXJ5IHBhcmFtZXRlciBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEluIGFkZGl0aW9uIHRvIHRoZSBmaXhlZCBlZmZlY3RzIGxpc3RlZCBoZXJlLCB0aGVzZSByZWdyZXNzaW9ucyBpbmNsdWRlZCByYW5kb20gaW50ZXJjZXB0cyBmb3IgcGFydGljaXBhbnRzLCBuZXN0ZWQgd2l0aGluIHN0dWRpZXMsIGZvciBhZHVsdHMgYW5kIGZvciA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuOyByYW5kb20gaW50ZXJjZXB0cyBmb3Igc3R1ZGllcyBmb3IgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoc2luY2UgbmVpdGhlciBzdHVkeSB3aXRoIHRoaXMgYWdlIGdyb3VwIGZlYXR1cmVkIGEgd2l0aGluLXN1YmplY3RzIGRlc2lnbik7IGFuZCByYW5kb20gaW50ZXJjZXB0cyBmb3IgdGFyZ2V0IGNoYXJhY3RlcnMgKG4gPSAyMSBmb3IgYWR1bHRzLCBuID0gOSBmb3IgYm90aCA3LSB0byA5LXllYXItb2xkIGFuZCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuKS4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyg0LCBib2xkID0gVCkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJBZHVsdHMiID0gMywgIkNoaWxkcmVuLCA3LTl5IiA9IDMsICJDaGlsZHJlbiwgNC02eSIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlQi4zCmBgYAoKYGBge3J9CnJlZ3RhYl9qb2ludGRlcF9kZXZjb21wIDwtIGZpeGVmKHJfam9pbnRkZXApICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInBhcmFtIikgJT4lCiAgbXV0YXRlKENJOTUgPSBwYXN0ZTAoIlsiLCBmb3JtYXQocm91bmQoUTIuNSwgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICIsICIsIGZvcm1hdChyb3VuZChROTcuNSwgMiksIG5zbWFsbCA9IDIpLCAiXSIpLAogICAgICAgICBub256ZXJvID0gaWZlbHNlKFEyLjUgKiBROTcuNSA+PSAwLCAiKiIsICIiKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgcy5lLiA9IEVzdC5FcnJvcikgJT4lCiAgbXV0YXRlKHBhcmFtID0gZmFjdG9yKHBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJJbnRlcmNlcHQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWdlX2dyb3VwX29sZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZ2VfZ3JvdXBfeW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZOmFnZV9ncm91cF9vbGQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWTphZ2VfZ3JvdXBfeW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCIsICJNSU5EOmFnZV9ncm91cF9vbGQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORDphZ2VfZ3JvdXBfeW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWTpNSU5EIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFk6TUlORDphZ2VfZ3JvdXBfb2xkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFk6TUlORDphZ2VfZ3JvdXBfeW5nIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkludGVyY2VwdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSAqIE9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZICogWW91bmdlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkQgKiBPbGRlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCAqIFlvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPRFkgKiBNSU5EIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSAqIE1JTkQgKiBPbGRlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSAqIE1JTkQgKiBZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiKSkpICU+JQogIHNlbGVjdChwYXJhbSwgYiwgcy5lLiwgQ0k5NSwgbm9uemVybykgJT4lCiAgYXJyYW5nZShwYXJhbSkKYGBgCgpgYGB7cn0KdGFibGVCLjQgPC0gcmVndGFiX2pvaW50ZGVwX2RldmNvbXAgJT4lCiAgc2VsZWN0KC1jb250YWlucygicy5lLiIpKSAlPiUKICBtdXRhdGUoYiA9IGZvcm1hdChyb3VuZChiLCAyKSwgbnNtYWxsID0gMikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSwKICAgICAgICAgYDk1JSBDSWAgPSBDSTk1KSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1Yigibm9uemVybyIsICIgIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgQi4zOiBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zIG9mIHRoZSBqb2ludCBkZXBlbmRlbmN5IG9mIEhFQVJUIG9uIGJvdGggQk9EWSBhbmQgTUlORC4gVGhlIHRhYmxlIHByZXNlbnRzIHJlc3VsdHMgZnJvbSBhIHNpbmdsZSBCYXllc2lhbiByZWdyZXNzaW9uIHVzaW5nIHBvb2xlZCBkYXRhIGZyb20gYWxsIHNhbXBsZXMgaW4gYWxsIHN0dWRpZXMuIFRoaXMgcmVncmVzc2lvbiBpbmNsdWRlZCAxMiBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQgKGZvciBhZHVsdHMpLCB3aGljaCBpcyBhbiBpbmRleCBvZiBIRUFSVCBzY29yZXMgYW1vbmcgYWR1bHRzIHdoZW4gQk9EWSBhbmQgTUlORCBzY29yZXMgd2VyZSBib3RoIHplcm87ICgyLTMpIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMgYW5kIHlvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyBpbiB0aGVpciBIRUFSVCBzY29yZXMgd2hlbiBCT0RZIGFuZCBNSU5EIHNjb3JlcyB3ZXJlIGJvdGggemVybzsgKDQtNikgdGhlIGVmZmVjdCBvZiBCT0RZIHNjb3JlcyBvbiBIRUFSVCBzY29yZXMgZm9yIGFkdWx0cywgYW5kIGRpZmZlcmVuY2VzIGZyb20gYWR1bHRzIGluIHRoaXMgZWZmZWN0IGZvciBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbjsgKDctOSkgdGhlIGVmZmVjdCBvZiBNSU5EIHNjb3JlcyBvbiBIRUFSVCBzY29yZXMgZm9yIGFkdWx0cywgYW5kIGRpZmZlcmVuY2VzIGZyb20gYWR1bHRzIGluIHRoaXMgZWZmZWN0IGZvciBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbjsgKDEwLTExKSB0aGUgaW50ZXJhY3RpdmUgZWZmZWN0IG9mIEJPRFkgYW5kIE1JTkQgc2NvcmVzIG9uIEhFQVJUIHNjb3JlcyBmb3IgYWR1bHRzLCBhbmQgZGlmZmVyZW5jZXMgZnJvbSBhZHVsdHMgaW4gdGhpcyBpbnRlcmFjdGl2ZSBlZmZlY3QgZm9yIG9sZGVyIGFuZCB5b3VuZ2VyIGNoaWxkcmVuLiBUaGVzZSBsYXN0IHRocmVlIGVmZmVjdHMgIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gSW4gYWRkaXRpb24gdG8gdGhlIGZpeGVkIGVmZmVjdHMgbGlzdGVkIGhlcmUsIHRoZSByZWdyZXNzaW9uIGluY2x1ZGVkIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMsIG5lc3RlZCB3aXRoaW4gc3R1ZGllcywgYW5kIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBjaGFyYWN0ZXJzIChuID0gMjQpLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMTA6MTIpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NvcmVzIHdoZW4gQk9EWSBzY29yZXMgYW5kIE1JTkQgc2NvcmVzID0gMCIsIDEsIDMpICU+JQogIGdyb3VwX3Jvd3MoIlRoZSBlZmZlY3Qgb2YgQk9EWSBzY29yZXMgb24gSEVBUlQgc2NvcmVzIHdoZW4gTUlORCBzY29yZXMgPSAwIiwgNCwgNikgJT4lCiAgZ3JvdXBfcm93cygiVGhlIGVmZmVjdCBvZiBNSU5EIHNjb3JlcyBvbiBIRUFSVCBzY29yZXMgd2hlbiBCT0RZIHNjb3JlcyA9IDAiLCA3LCA5KSAlPiUKICBncm91cF9yb3dzKCJUaGUgaW50ZXJhY3RpdmUgZWZmZWN0IG9mIEJPRFkgc2NvcmVzIGFuZCBNSU5EIHNjb3JlcyBvbiBIRUFSVCBzY29yZXMiLCAxMCwgMTIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZUIuNApgYGAKCg==